﻿using System.Collections.Generic;
using UnityEngine;

// 通用工具类，提供各种静态方法用于数学计算、时间获取、列表处理等
public static class CommonTools
{
    /// <summary>
    /// 检查浮点数是否有效，即不是无穷大且不是NaN
    /// </summary>
    /// <param name="value">待检查的浮点数</param>
    /// <returns>如果浮点数有效返回true，否则返回false</returns>
    public static bool IsFloatValid(float value)
    {
        if (float.IsInfinity(value))
            return false;
        if (float.IsNaN(value))
            return false;

        return true;
    }

    /// <summary>
    /// 检查向量数据是否有效，即向量的x、y、z分量都是有效的浮点数
    /// </summary>
    /// <param name="vec">待检查的向量</param>
    /// <returns>如果向量数据有效返回true，否则返回false</returns>
    public static bool CheckVectorData(Vector3 vec)
    {
        if (!IsFloatValid(vec.x))
            return false;
        if (!IsFloatValid(vec.y))
            return false;
        if (!IsFloatValid(vec.z))
            return false;
        return true;
    }



    /// <summary>
    /// 计算路径的总长度
    /// </summary>
    /// <param name="pathPoint">路径上的点数组</param>
    /// <returns>路径的总长度</returns>
    public static float GetPathLenght(Vector3[] pathPoint)
    {
        float fDis = 0;
        for (int i = 0; i < pathPoint.Length - 1; ++i)
        {
            fDis += Vector3.Distance(pathPoint[i], pathPoint[i + 1]);
        }
        return fDis;
    }




    /// <summary>
    /// 清理列表里的空项
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="itemList"></param>
    public static void ClearListNullItem<T>(List<T> itemList)
    {
        for (int i = 0; i < itemList.Count;)
        {
            if (itemList[i] == null)
            {
                itemList.RemoveAt(i);
                continue;
            }
            ++i;
        }
    }

    public static void FixListValue<T>(ref List<T> itemList, int num) where T : new()
    {
        if (itemList == null)
            return;

        // 如果num大于当前列表长度，补充新实例
        while (itemList.Count < num)
        {
            itemList.Add(new T());
        }

        // 如果num小于当前列表长度，移除多余元素
        while (itemList.Count > num)
        {
            itemList.RemoveAt(itemList.Count - 1);
        }
    }

}
